home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / UNIX / DATABASE / INDEX / SEARCHDB.C < prev    next >
C/C++ Source or Header  |  1992-11-23  |  2KB  |  112 lines

  1. #ifndef lint
  2. static char *RCSid = "$Header: /u5/davy/progs/index/RCS/searchdb.c,v 1.1 89/08/09 11:06:59 davy Exp $";
  3. #endif
  4. /*
  5.  * searchdb.c - database search routine.
  6.  *
  7.  * David A. Curry
  8.  * Research Institute for Advanced Computer Science
  9.  * Mail Stop 230-5
  10.  * NASA Ames Research Center
  11.  * Moffett Field, CA 94035
  12.  * davy@riacs.edu
  13.  *
  14.  * $Log:    searchdb.c,v $
  15.  * Revision 1.1  89/08/09  11:06:59  davy
  16.  * Initial revision
  17.  * 
  18.  */
  19. #include <curses.h>
  20. #include <ctype.h>
  21. #include <stdio.h>
  22. #include "defs.h"
  23.  
  24. /*
  25.  * search_db - search the database for the pattern.
  26.  */
  27. search_db(pattern)
  28. char *pattern;
  29. {
  30.     int code = 0;
  31.     char *re_comp();
  32.     char buf[BUFSIZ];
  33.     register int i, j;
  34.     register char *p, *q;
  35.  
  36.     /*
  37.      * If we're ignoring case, convert the pattern
  38.      * to all lower case.
  39.      */
  40.     if (igncase) {
  41.         for (p = pattern; *p != NULL; p++) {
  42.             if (isupper(*p))
  43.                 *p = tolower(*p);
  44.         }
  45.     }
  46.  
  47.     /*
  48.      * Compile the regular expression.
  49.      */
  50.     if (re_comp(pattern) != NULL)
  51.         return(0);
  52.  
  53.     /*
  54.      * For all entries...
  55.      */
  56.     for (i=0; i < dbentries; i++) {
  57.         /*
  58.          * For each line in the entry...
  59.          */
  60.         for (j=0; j < idx.idx_nlines; j++) {
  61.             /*
  62.              * If this line is not to be searched,
  63.              * skip it.
  64.              */
  65.             if (idx.idx_search[j] == 0)
  66.                 continue;
  67.  
  68.             /*
  69.              * If ignoring case, copy the line an
  70.              * convert it to lower case.  Otherwise,
  71.              * use it as is.
  72.              */
  73.             if (igncase) {
  74.                 p = db[i].db_lines[j];
  75.                 q = buf;
  76.  
  77.                 while (*p != NULL) {
  78.                     *q++ = isupper(*p) ? tolower(*p) : *p;
  79.                     p++;
  80.                 }
  81.  
  82.                 *q = '\0';
  83.  
  84.                 /*
  85.                  * If we get a match, mark this entry as
  86.                  * printable.
  87.                  */
  88.                 if (re_exec(buf)) {
  89.                     db[i].db_flag |= DB_PRINT;
  90.                     code = 1;
  91.                 }
  92.             }
  93.             else {
  94.                 /*
  95.                  * If we get a match, mark this entry
  96.                  * as printable.
  97.                  */
  98.                 if (re_exec(db[i].db_lines[j])) {
  99.                     db[i].db_flag |= DB_PRINT;
  100.                     code = 1;
  101.                 }
  102.             }
  103.         }
  104.     }
  105.  
  106.     /*
  107.      * Return whether or not we found anything.
  108.      */
  109.     return(code);
  110. }
  111.  
  112.